# 作用域

def outer_function():
    a = 20

    def inner_function():
        a = 30
        print('a =', a)

    inner_function()
    print('a =', a)


a = 10
outer_function()
print('a =', a)
# 输出：
# a = 30
# a = 20
# a = 10   

def outer_function():
    global a
    a = 20

    def inner_function():
        global a
        a = 30
        print('a =', a)

    inner_function()
    print('a =', a)

a = 10
outer_function()
print('a =', a)
# 输出：
# a = 30
# a = 30
# a = 30


# 闭包
def outer_function(x):
    def inner_function(y):
        return x * y
    return inner_function

closure = outer_function(2)
print(closure(5))  # 输出：10
print(closure(10))  # 输出：200
# closure 是个闭包函数，它引用了外部函数 outer_function 的局部变量 x。
# 当我们调用 closure(5) 时，它会返回 2 * 5 = 10。
# 单元格对象具有存储关闭值的属性cell_contents


# 正则表达式
import re # 导入re模块, 用于操作正则表达式

# re.match() 方法用于在字符串的开头进行匹配。
pattern = r'\d+' # 匹配一个或多个数字
string = 'Hello 123 World 456'

# re.findall()方法返回包含所有匹配项的字符串列表。
pattern = r'\d+'
string = 'Hello 123 World 456'
matches = re.findall(pattern, string) # 输出：['123', '456']

# split方法对匹配的字符串进行拆分，并返回发生拆分的字符串列表。
pattern = r'\s+'
string = 'Hello World'
matches = re.split(pattern, string) # 输出：['Hello', 'World']

# re.sub() 方法用于替换字符串中的匹配项。
pattern = r'\d+'
string = 'Hello 123 World 456'
new_string = re.sub(pattern, '789', string) # 输出：Hello 789 World 789


# re.subn() 方法用于替换字符串中的匹配项，并返回替换的次数。
pattern = r'\d+'
string = 'Hello 123 World 456'
new_string, count = re.subn(pattern, '789', string) # 输出：Hello 789 World 789, 2

# re.compile() 方法用于编译正则表达式模式。
pattern = r'\d+'
regex = re.compile(pattern) # 输出：<re.Match object; span=(5, 8), match='123'>
print(regex.match('Hello 123 World 456'))

# re.search() 方法用于在字符串中搜索匹配项。
pattern = r'\d+'
string = 'Hello 123 World 456'
match = re.search(pattern, string)
print(match.group())  # 输出：123

# 匹配对象

# 匹配字符串中的数字; group()方法返回字符串中匹配的部分
pattern = r'\d+'
string = 'Hello 123 World 456'
match = re.search(pattern, string)
print(match.group())  # 输出：123

# match.start()，match.end()和match.span()
# 这些方法返回匹配项在字符串中的起始位置、结束位置和跨度。
pattern = r'\d+'
string = 'Hello 123 World 456'
match = re.search(pattern, string)
print(match.start())  # 输出：6
print(match.end())  # 输出：9

# 在RegEx之前使用r前缀，以告诉Python这是一个原始字符串。
# 原始字符串不处理反斜杠。
string = '\n and \r are escape sequences.'

result = re.findall(r'[\n\r]', string) 
print(result) # 输出: ['\n', '\r']

# random 模块，随机模块
import random
random.seed(2)

print(random.random())
print(random.random())
print(random.random())


# 数组
import array as arr
a = arr.array('d', [1.1, 3.5, 4.5]) # d 表示浮点数
print(a) # 输出: array('d', [1.1, 3.5, 4.5])

# 访问数组元素
a = arr.array('i', [2, 4, 6, 8])
print("第一个元素:", a[0])
print("第二个元素:", a[1])
print("最后一个元素:", a[-1])

# 切片
a = arr.array('i', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(a[1:5]) # 输出: array('i', [2, 3, 4, 5])
print(a[:5]) # 输出: array('i', [1, 2, 3, 4, 5])


# 字典
#item price in dollars
old_price = {'milk': 1.02, 'coffee': 2.5, 'bread': 2.5}

dollar_to_pound = 0.76
new_price = {item: value*dollar_to_pound for (item, value) in old_price.items()}
print(new_price) # 输出: {'milk': 0.7752, 'coffee': 1.9, 'bread': 1.9}

# 具有两个字典理解的嵌套字典
dictionary = {
    k1: {k2: k1 * k2 for k2 in range(1, 6)} for k1 in range(2, 5)
}
print(dictionary)
# 同
dictionary = dict()
for k1 in range(11, 16):
    dictionary[k1] = {k2: k1*k2 for k2 in range(1, 6)}
print(dictionary)
# 同
dictionary = dict()
for k1 in range(11, 16):
    dictionary[k1] = dict()
    for k2 in range(1, 6):
        dictionary[k1][k2] = k1*k2
print(dictionary)
# 以上三个输出结果相同


# 多态
class Cat:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(f"我是一只猫。我的名字是 {self.name}. 我是 {self.age} 岁.")

    def make_sound(self):
        print("Meow")

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(f"我是一只狗。 我的名字是 {self.name}. 我是  {self.age} 岁.")

    def make_sound(self):
        print("Bark")

cat1 = Cat("Kitty", 2.5)
dog1 = Dog("Fluffy", 4)

# 没有创建公共类，还可以打包到一个元组中，并使用一个公共animal变量对其进行迭代
for animal in (cat1, dog1):
    animal.make_sound()
    animal.info()
    animal.make_sound()
# 输出：
# Meow
# 我是一只猫。我的名字是 Kitty. 我是 2.5 岁.
# Meow
# Bark
# 我是一只狗。 我的名字是 Fluffy. 我是  4 岁.
# Bark

